package br.boicotando.server;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import br.boicotando.dominio.DadosPedido;


public class PedidoParser {
	private URL documento;


	public PedidoParser(URL url) throws IOException {
		documento = url;
	}

	private DadosPedido bindPedido(NamedNodeMap attrs) {
		String attr;
		String value;
		DadosPedido pedido = new DadosPedido();
		for (int i = 0; (i < attrs.getLength()); ++i) {
			attr = attrs.item(i).getNodeName();
			value = attrs.item(i).getNodeValue();
			if (attr.equals("id")) {
				pedido.setId(value);
			} else if (attr.equals("codigo_cliente")) {
				pedido.setCodigoCliente(value);
			} else if (attr.equals("codigo_produto")) {
				pedido.setCodigoProduto(value);
			} else if (attr.equals("quantidade")) {
				pedido.setQuantidade(Integer.valueOf(value));
			} else if (attr.equals("preco_unitario")) {
				pedido.setPrecoUnitario(Float.valueOf(value));
			} else if (attr.equals("forma_pagamento")) {
				pedido.setFormaPagamento(value);
			} else if (attr.equals("codigo_condicao_pagamento")) {
				pedido.setCodigoCondicaoPagamento(value);
			} 
		}
		return pedido;
	}

	private void bind( List<DadosPedido> envioPedido, Node node) {
		int type = node.getNodeType();
		switch (type) {
			case Node.DOCUMENT_NODE: {
				bind(envioPedido, ((Document) node).getDocumentElement());
				break;
			}
			case Node.ELEMENT_NODE: {
				NamedNodeMap attrs = node.getAttributes();
				if (node.getNodeName().equals("pedido")) {
					DadosPedido pedido = bindPedido(attrs);
					envioPedido.add(pedido);
				}
				if (node.hasChildNodes()) {
					NodeList children = node.getChildNodes();
					for (int i = 0; i < children.getLength(); i++) {
						bind(envioPedido, children.item(i));
					}
				}
				break;
			}
		}
	}

	public List<DadosPedido> parse() throws Exception {
		List<DadosPedido> pedido = new ArrayList<DadosPedido>();
		DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
		docBuilderFactory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
		Document doc = docBuilder.parse(documento.openConnection().getInputStream());
		bind(pedido, doc);
		return pedido;
	}
}
